Apache Commons Collections হলো Apache Software Foundation এর একটি ওপেন সোর্স জাভা লাইব্রেরি, যা Java Collections Framework এর উপর ভিত্তি করে তৈরি করা হয়েছে এবং এটি বিভিন্ন ডেটা স্ট্রাকচার এবং ইউটিলিটি ক্লাস সরবরাহ করে। এটি ডেভেলপারদের জন্য সাধারণ জাভা কালেকশন অপারেশনগুলোকে আরও সহজ এবং কার্যকরভাবে সম্পন্ন করতে সহায়ক করে এবং জাভার ডিফল্ট কালেকশন ফ্রেমওয়ার্কে পাওয়া না যাওয়া কিছু অতিরিক্ত কার্যকারিতা যোগ করে।
Apache Commons Collections হলো Apache Commons প্রকল্পের একটি অংশ, যা Java Collections Framework এর কার্যকারিতা বাড়াতে অতিরিক্ত ডেটা স্ট্রাকচার, ইউটিলিটি ক্লাস এবং অ্যালগরিদম সরবরাহ করে। এটি মূলত Java Collections API (যেমন List
, Set
, Map
) এর সীমাবদ্ধতা কাটিয়ে উঠতে এবং ডেভেলপারদের জন্য আরও ফ্লেক্সিবল ও পুনরায় ব্যবহারযোগ্য সমাধান দিতে ব্যবহৃত হয়।
Java Collections API ডেভেলপারদের জন্য অনেক সুবিধা প্রদান করলেও কিছু কমন কাজের জন্য আলাদা সমাধান প্রয়োজন হয়। Apache Commons Collections এই কাজগুলোকে আরও সহজ, কার্যকর এবং পারফরম্যান্সবান্ধব করে তোলে।
ধাপ ১: Maven ডিপেন্ডেন্সি যোগ করা
Apache Commons Collections ব্যবহার করার জন্য আপনাকে Maven প্রজেক্টে ডিপেন্ডেন্সি যোগ করতে হবে। নিচের কোডটি pom.xml
ফাইলে যোগ করুন:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.4</version>
</dependency>
এটি Apache Commons Collections এর সর্বশেষ সংস্করণ commons-collections4
যোগ করবে।
ধাপ ২: Bag ইন্টারফেস ব্যবহার করা
Bag হলো একটি বিশেষ ধরণের Collection, যা একটি উপাদানের সংখ্যা গণনা করে। সাধারণত Set উপাদানগুলোকে শুধুমাত্র একবার স্টোর করে, কিন্তু Bag একাধিকবার একই উপাদান রাখতে পারে এবং তাদের গণনা করতে পারে।
import org.apache.commons.collections4.Bag;
import org.apache.commons.collections4.bag.HashBag;
public class BagExample {
public static void main(String[] args) {
Bag<String> bag = new HashBag<>();
bag.add("Apple", 3); // 3 বার Apple যোগ করা
bag.add("Banana");
bag.add("Orange", 2); // 2 বার Orange যোগ করা
System.out.println("Apple Count: " + bag.getCount("Apple")); // আউটপুট: 3
System.out.println("Orange Count: " + bag.getCount("Orange")); // আউটপুট: 2
System.out.println("Total unique items: " + bag.size()); // আউটপুট: 3
bag.remove("Apple", 1); // 1 বার Apple মুছে ফেলা
System.out.println("Apple Count after removal: " + bag.getCount("Apple")); // আউটপুট: 2
}
}
ধাপ ৩: BidiMap ব্যবহার করা
BidiMap (Bidirectional Map) হলো এমন একটি Map, যা কেবল key-value জোড়ার উপর ভিত্তি করে কাজ করে না, বরং value এর উপর ভিত্তি করে key ও খুঁজে বের করতে পারে। অর্থাৎ, এটি key এবং value উভয়কেই ইউনিক রাখে।
import org.apache.commons.collections4.BidiMap;
import org.apache.commons.collections4.bidimap.TreeBidiMap;
public class BidiMapExample {
public static void main(String[] args) {
BidiMap<String, String> bidiMap = new TreeBidiMap<>();
bidiMap.put("1", "Apple");
bidiMap.put("2", "Banana");
bidiMap.put("3", "Orange");
System.out.println("Key for value 'Apple': " + bidiMap.getKey("Apple")); // আউটপুট: 1
System.out.println("Value for key '2': " + bidiMap.get("2")); // আউটপুট: Banana
bidiMap.removeValue("Orange");
System.out.println("Key for value 'Orange' after removal: " + bidiMap.getKey("Orange")); // আউটপুট: null
}
}
ধাপ ৪: MultiMap ব্যবহার করা
MultiMap হলো একটি বিশেষ ধরনের Map, যেখানে একাধিক value একটি key এর সাথে সংযুক্ত থাকতে পারে।
import org.apache.commons.collections4.MultiValuedMap;
import org.apache.commons.collections4.multimap.ArrayListValuedHashMap;
public class MultiMapExample {
public static void main(String[] args) {
MultiValuedMap<String, String> multiMap = new ArrayListValuedHashMap<>();
multiMap.put("Fruit", "Apple");
multiMap.put("Fruit", "Banana");
multiMap.put("Fruit", "Orange");
multiMap.put("Vegetable", "Carrot");
System.out.println("Fruits: " + multiMap.get("Fruit")); // আউটপুট: [Apple, Banana, Orange]
System.out.println("Vegetables: " + multiMap.get("Vegetable")); // আউটপুট: [Carrot]
// সব values প্রিন্ট করা
multiMap.entries().forEach(System.out::println);
}
}
ধাপ ৫: Transformer ব্যবহার করা
Transformer ব্যবহার করে আপনি ডেটার উপর বিভিন্ন রূপান্তর (transformation) প্রয়োগ করতে পারেন। এটি মূলত ডেটার উপর অপারেশন প্রয়োগ করে একটি নতুন ফর্মে রূপান্তরিত করে।
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.Transformer;
import java.util.Arrays;
import java.util.List;
public class TransformerExample {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
Transformer<Integer, Integer> squareTransformer = input -> input * input;
List<Integer> squaredNumbers = (List<Integer>) CollectionUtils.collect(numbers, squareTransformer);
System.out.println("Original numbers: " + numbers);
System.out.println("Squared numbers: " + squaredNumbers);
}
}
ধাপ ৬: Closure ব্যবহার করা
Closure হলো একটি অপারেশন, যা একটি ডেটার উপর প্রয়োগ করা হয় কিন্তু কোনো মান রিটার্ন করে না। এটি সাধারণত সাইড-ইফেক্ট তৈরি করার জন্য ব্যবহৃত হয়।
import org.apache.commons.collections4.Closure;
import org.apache.commons.collections4.IterableUtils;
import java.util.Arrays;
import java.util.List;
public class ClosureExample {
public static void main(String[] args) {
List<String> names = Arrays.asList("John", "Jane", "Mark");
Closure<String> printClosure = System.out::println;
IterableUtils.forEach(names, printClosure);
}
}
Apache Commons Collections হলো একটি শক্তিশালী এবং ফ্লেক্সিবল লাইব্রেরি, যা Java Collections API এর সীমাবদ্ধতা কাটিয়ে উঠে অতিরিক্ত ডেটা স্ট্রাকচার, utility ক্লাস, এবং অ্যালগরিদম প্রদান করে। এটি Bag, BidiMap, MultiMap এবং আরও অনেক নতুন ডেটা স্ট্রাকচার সরবরাহ করে, যা জাভা ডেভেলপারদের ডেটা ম্যানেজমেন্ট এবং প্রসেসিং সহজ করে তোলে। যদিও Java 8 এবং এর পরবর্তী সংস্করণে নতুন ফিচার যোগ হওয়ার কারণে এর ব্যবহার কিছুটা কমে গেছে, তবে এখনও বড় বড় প্রজেক্টে এটি একটি কার্যকর টুল হিসেবে ব্যবহৃত হয়।
Apache Commons Collections হলো Apache Software Foundation এর একটি ওপেন সোর্স জাভা লাইব্রেরি, যা Java Collections Framework এর উপর ভিত্তি করে তৈরি করা হয়েছে এবং এটি বিভিন্ন ডেটা স্ট্রাকচার এবং ইউটিলিটি ক্লাস সরবরাহ করে। এটি ডেভেলপারদের জন্য সাধারণ জাভা কালেকশন অপারেশনগুলোকে আরও সহজ এবং কার্যকরভাবে সম্পন্ন করতে সহায়ক করে এবং জাভার ডিফল্ট কালেকশন ফ্রেমওয়ার্কে পাওয়া না যাওয়া কিছু অতিরিক্ত কার্যকারিতা যোগ করে।
Apache Commons Collections হলো Apache Commons প্রকল্পের একটি অংশ, যা Java Collections Framework এর কার্যকারিতা বাড়াতে অতিরিক্ত ডেটা স্ট্রাকচার, ইউটিলিটি ক্লাস এবং অ্যালগরিদম সরবরাহ করে। এটি মূলত Java Collections API (যেমন List
, Set
, Map
) এর সীমাবদ্ধতা কাটিয়ে উঠতে এবং ডেভেলপারদের জন্য আরও ফ্লেক্সিবল ও পুনরায় ব্যবহারযোগ্য সমাধান দিতে ব্যবহৃত হয়।
Java Collections API ডেভেলপারদের জন্য অনেক সুবিধা প্রদান করলেও কিছু কমন কাজের জন্য আলাদা সমাধান প্রয়োজন হয়। Apache Commons Collections এই কাজগুলোকে আরও সহজ, কার্যকর এবং পারফরম্যান্সবান্ধব করে তোলে।
ধাপ ১: Maven ডিপেন্ডেন্সি যোগ করা
Apache Commons Collections ব্যবহার করার জন্য আপনাকে Maven প্রজেক্টে ডিপেন্ডেন্সি যোগ করতে হবে। নিচের কোডটি pom.xml
ফাইলে যোগ করুন:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.4</version>
</dependency>
এটি Apache Commons Collections এর সর্বশেষ সংস্করণ commons-collections4
যোগ করবে।
ধাপ ২: Bag ইন্টারফেস ব্যবহার করা
Bag হলো একটি বিশেষ ধরণের Collection, যা একটি উপাদানের সংখ্যা গণনা করে। সাধারণত Set উপাদানগুলোকে শুধুমাত্র একবার স্টোর করে, কিন্তু Bag একাধিকবার একই উপাদান রাখতে পারে এবং তাদের গণনা করতে পারে।
import org.apache.commons.collections4.Bag;
import org.apache.commons.collections4.bag.HashBag;
public class BagExample {
public static void main(String[] args) {
Bag<String> bag = new HashBag<>();
bag.add("Apple", 3); // 3 বার Apple যোগ করা
bag.add("Banana");
bag.add("Orange", 2); // 2 বার Orange যোগ করা
System.out.println("Apple Count: " + bag.getCount("Apple")); // আউটপুট: 3
System.out.println("Orange Count: " + bag.getCount("Orange")); // আউটপুট: 2
System.out.println("Total unique items: " + bag.size()); // আউটপুট: 3
bag.remove("Apple", 1); // 1 বার Apple মুছে ফেলা
System.out.println("Apple Count after removal: " + bag.getCount("Apple")); // আউটপুট: 2
}
}
ধাপ ৩: BidiMap ব্যবহার করা
BidiMap (Bidirectional Map) হলো এমন একটি Map, যা কেবল key-value জোড়ার উপর ভিত্তি করে কাজ করে না, বরং value এর উপর ভিত্তি করে key ও খুঁজে বের করতে পারে। অর্থাৎ, এটি key এবং value উভয়কেই ইউনিক রাখে।
import org.apache.commons.collections4.BidiMap;
import org.apache.commons.collections4.bidimap.TreeBidiMap;
public class BidiMapExample {
public static void main(String[] args) {
BidiMap<String, String> bidiMap = new TreeBidiMap<>();
bidiMap.put("1", "Apple");
bidiMap.put("2", "Banana");
bidiMap.put("3", "Orange");
System.out.println("Key for value 'Apple': " + bidiMap.getKey("Apple")); // আউটপুট: 1
System.out.println("Value for key '2': " + bidiMap.get("2")); // আউটপুট: Banana
bidiMap.removeValue("Orange");
System.out.println("Key for value 'Orange' after removal: " + bidiMap.getKey("Orange")); // আউটপুট: null
}
}
ধাপ ৪: MultiMap ব্যবহার করা
MultiMap হলো একটি বিশেষ ধরনের Map, যেখানে একাধিক value একটি key এর সাথে সংযুক্ত থাকতে পারে।
import org.apache.commons.collections4.MultiValuedMap;
import org.apache.commons.collections4.multimap.ArrayListValuedHashMap;
public class MultiMapExample {
public static void main(String[] args) {
MultiValuedMap<String, String> multiMap = new ArrayListValuedHashMap<>();
multiMap.put("Fruit", "Apple");
multiMap.put("Fruit", "Banana");
multiMap.put("Fruit", "Orange");
multiMap.put("Vegetable", "Carrot");
System.out.println("Fruits: " + multiMap.get("Fruit")); // আউটপুট: [Apple, Banana, Orange]
System.out.println("Vegetables: " + multiMap.get("Vegetable")); // আউটপুট: [Carrot]
// সব values প্রিন্ট করা
multiMap.entries().forEach(System.out::println);
}
}
ধাপ ৫: Transformer ব্যবহার করা
Transformer ব্যবহার করে আপনি ডেটার উপর বিভিন্ন রূপান্তর (transformation) প্রয়োগ করতে পারেন। এটি মূলত ডেটার উপর অপারেশন প্রয়োগ করে একটি নতুন ফর্মে রূপান্তরিত করে।
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.Transformer;
import java.util.Arrays;
import java.util.List;
public class TransformerExample {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
Transformer<Integer, Integer> squareTransformer = input -> input * input;
List<Integer> squaredNumbers = (List<Integer>) CollectionUtils.collect(numbers, squareTransformer);
System.out.println("Original numbers: " + numbers);
System.out.println("Squared numbers: " + squaredNumbers);
}
}
ধাপ ৬: Closure ব্যবহার করা
Closure হলো একটি অপারেশন, যা একটি ডেটার উপর প্রয়োগ করা হয় কিন্তু কোনো মান রিটার্ন করে না। এটি সাধারণত সাইড-ইফেক্ট তৈরি করার জন্য ব্যবহৃত হয়।
import org.apache.commons.collections4.Closure;
import org.apache.commons.collections4.IterableUtils;
import java.util.Arrays;
import java.util.List;
public class ClosureExample {
public static void main(String[] args) {
List<String> names = Arrays.asList("John", "Jane", "Mark");
Closure<String> printClosure = System.out::println;
IterableUtils.forEach(names, printClosure);
}
}
Apache Commons Collections হলো একটি শক্তিশালী এবং ফ্লেক্সিবল লাইব্রেরি, যা Java Collections API এর সীমাবদ্ধতা কাটিয়ে উঠে অতিরিক্ত ডেটা স্ট্রাকচার, utility ক্লাস, এবং অ্যালগরিদম প্রদান করে। এটি Bag, BidiMap, MultiMap এবং আরও অনেক নতুন ডেটা স্ট্রাকচার সরবরাহ করে, যা জাভা ডেভেলপারদের ডেটা ম্যানেজমেন্ট এবং প্রসেসিং সহজ করে তোলে। যদিও Java 8 এবং এর পরবর্তী সংস্করণে নতুন ফিচার যোগ হওয়ার কারণে এর ব্যবহার কিছুটা কমে গেছে, তবে এখনও বড় বড় প্রজেক্টে এটি একটি কার্যকর টুল হিসেবে ব্যবহৃত হয়।